package br.unesp.demac.bcc.soo.clarus.dao;

import br.unesp.demac.bcc.soo.clarus.bean.Autor;
import br.unesp.demac.bcc.soo.clarus.bean.Localizacao;
import br.unesp.demac.bcc.soo.clarus.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Evaldo
 */
public class AutorDAOImp implements AutorDAO {

    /**
     * Salva o autor da obra
     * @param conn Conexão com o BD
     * @param autor Autor da Obra
     * @param idObra Id da Obra
     * @return Status da inserção
     */
    @Override
    public boolean salvarAutor(Connection conn, Autor autor, int idObra) {
        final String queryAutor = "INSERT INTO autor(nomeAutor) "
                + "VALUES (?);";
        final String queryAutorHasObra = "INSERT INTO autor_has_obra(Obra_idObra, Autor_idAutor) "
                + "VALUES (?, ?);";
        boolean salvo = false;
        int idAutor = 0;

        PreparedStatement pstmt = null;
        ResultSet res = null;

        try {
            //inserindo Autor
            pstmt = conn.prepareStatement(queryAutor, PreparedStatement.RETURN_GENERATED_KEYS);
            pstmt.setString(1, autor.getNomeAutor());
            pstmt.executeUpdate();
            res = pstmt.getGeneratedKeys();
            if (res.next()) {
                idAutor = res.getInt(1);
            }

            //inserindo a relação Autor - Obra
            pstmt = conn.prepareStatement(queryAutorHasObra);
            pstmt.setInt(1, idObra);
            pstmt.setInt(2, idAutor);
            pstmt.execute();

            salvo = true;
        } catch (SQLException ex) {
            System.out.println("Erro ao inserir autor: " + ex.getMessage());
        } finally {
            FabricaConexao.fechar(pstmt);
        }

        return salvo;
    }
    
    @Override
    public Autor getAutorById(Connection conn, int idAutor) {

        final String query = "SELECT nomeAutor FROM Autor WHERE idAutor = ?";
        PreparedStatement pstmt = null;
        ResultSet res = null;
        Autor autor = null;

        if (conn != null) {
            try {
                
                pstmt = conn.prepareStatement(query);
                pstmt.setInt(1, idAutor);
                res = pstmt.executeQuery();

                if (res.next()) {
                    autor = new Autor();
                    autor.setNomeAutor(res.getString("nomeAutor"));
                } 

            } catch (SQLException ex) {
                System.out.println("Erro ao recuperar autor: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(pstmt);
            }
        }

        return autor;
    }
    
    @Override
    public List<Autor> getAutoresByObraId(Connection conn, int idObra) {

        final String query = "SELECT Autor_idAutor, nomeAutor FROM Autor_has_obra "
                + "JOIN Autor ON Autor_has_Obra.Autor_idAutor = idAutor "
                + "WHERE Obra_idObra = ?;";
        PreparedStatement pstmt = null;
        ResultSet res = null;
        List<Autor> autores = new ArrayList<Autor>();

        if (conn != null) {
            try {
                
                pstmt = conn.prepareStatement(query);
                pstmt.setInt(1, idObra);
                res = pstmt.executeQuery();
                
                Autor a;
                while (res.next()) {
                    a = new Autor();
                    a.setNomeAutor(res.getString("nomeAutor"));
                    autores.add(a);
                } 

            } catch (SQLException ex) {
                System.out.println("Erro ao recuperar Autor: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(pstmt);
            }
        }

        return autores;
    }
}
